package com.itguigu.cas;

/**
 *      CAS是项乐观锁技术，当多个线程尝试使用CAS同时更新同一个变量时，只有其中一个线程能更新变量的值，而其它线程都失败，
 * 失败的线程并不会被挂起，而是被告知这次竞争中失败，并可以再次尝试。
 *      CAS有3个操作数，内存值V，旧的预期值A，要修改的新值B。当且仅当预期值A和内存值V相同时，
 * 将内存值V修改为B，否则什么都不做
 */
public class CASDemo {

    public static void main(String[] args) {
        final CompareAndSwap cas = new CompareAndSwap();
        for (int i =0;i<10;i++){
            new Thread(new Runnable() {
                public void run() {
                    int expectValue = cas.get();
                    System.out.println("====="+expectValue);
                    boolean b= cas.compareAndSet(expectValue,(int)(Math.random()*101));
                    System.out.println("*****"+b);
                  System.out.println("---------------------------------");
                }
            }).start();
        }
    }

}
class CompareAndSwap{
    private  int value;//内存值

    public  synchronized int get(){
        return value;
    }
    //比较
    public synchronized int compareAndSwap(int expectValue,int newValue){
        int oldValue=value;
        if (oldValue == expectValue){
            this.value = newValue;
        }
        return oldValue;
    }
    public synchronized boolean compareAndSet(int expectValue,int newValue){
        return expectValue == compareAndSwap(expectValue,newValue);
    }
}
